package com.wjh.www.dao.mapper;

import com.wjh.www.annotation.mybatis.*;
import com.wjh.www.proxy.constans.DataType;

import java.util.List;
import java.util.Map;

/**
 * 所有mapper类的共同父类，提供一些简单的通用方法
 *
 * @param <T>
 */
public interface BaseMapper<T> {
    /**
     * 用于“增“的操作
     *
     * @param obj 传入的对象被封装好的对象
     * @return 返回数据发生改变的行数
     */
    @Insert()
    int insert(T obj);

    /**
     * 用于“删”的操作
     *
     * @param obj 传入的被封装好的对象
     * @return 返回数据发生改变的行数
     */
    @Delete()
    int delete(T obj);

    /**
     * 用于“改”地操作，不够该方法只能根据id来改
     *
     * @param obj 传入的被封装好的对象
     * @return 返回数据发生改变的行数
     */
    @Update()
    int updateById(T obj);

    /**
     * 通过map集合来装where条件
     *
     * @param obj 封装有新数据的对象
     * @param map 存放where条件的map集合
     * @return 返回数据发生改变的行数
     */
    @Update
    int updateByMap(T obj, Map<String, Object> map);

    /**
     * 通过id来查询
     *
     * @param obj 存放表的字段
     * @return 返回T
     */
    @Select(fields = "*")
    @ReturnType(returns = DataType.OBJECT)
    T selectById(T obj);

    /**
     * 通过字段来查询多个对象
     *
     * @param obj po类
     * @return 返回list集合
     */
    @Select(fields = "*")
    @ReturnType(returns = DataType.LIST)
    List<T> selectListByFields(T obj);

    /**
     * 通过字段来查询一个对象
     *
     * @param obj po类
     * @return 返回一个对象
     */
    @Select(fields = "*")
    @ReturnType(returns = DataType.OBJECT)
    T selectOneByFields(T obj);
}
